package cn.kgc;


import cn.kgc.websocket.WebSocketServerInitializer;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;

/**
 * 聊天服务器的启动类
 */

public class ChatServerApp {
    public static void main(String[] args) {
        //主线程池用来接收客户端发送的请求
        NioEventLoopGroup boss = new NioEventLoopGroup();
        //工作线程池用来处理客户端发送的请求
        NioEventLoopGroup worker = new NioEventLoopGroup();
        //创建服务端启动对象
        ServerBootstrap server = new ServerBootstrap();
        //设置主线程池  工作线程池
        server.group(boss, worker)
                //客户端和服务端通信的通道类型(通过通道实现客户端和服务端之间发送消息)
                .channel(NioServerSocketChannel.class)
                //使用websocket的处理器
                .childHandler(new WebSocketServerInitializer());
        //设置聊天服务的端口号
        //bind方法用于绑定端口号 该方法是一个异步的方法 有可能当大还没有执行完（绑定端口）  就执行后面的方法了
        //所以我们在后面使用了sync()方法来保证bind方法执行完
        try {
            ChannelFuture sync = server.bind(4002).sync();
            //监听关闭的通道  如果关闭了 聊天的服务端 会执行一下的代码
            sync.channel().closeFuture().sync();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }finally {
            //关闭线程池
            boss.shutdownGracefully();
            worker.shutdownGracefully();
        }
    }
}
